知识点名称:蓝牙通信
编号: K9-6
前驱知识点编号:K9-1,K9-2,K9-3,K9-4
作者:
讲义内容:
常用的类和接口:
表示本地蓝牙适配器,主要用来对蓝牙进行基本操作,它是所有蓝牙交互操作的入口,如搜索其他的蓝牙设备、查询可配对的设备集合、根据已知的MAC地址来初始化一个BluetoothDevice实例对象、创建一个BluetoothServerSocket类以监听其它设备对本机的连接请求等。
获取BluetoothAdapter实例,在Android4、4.2.2(对应的API级别为17)及之前的版本使用getDefaultAdapter()方法获取,在Android4.3(对应的API级别为18)及其以后的版本中可以使用getSystemService()和BLUETOOTH_SERVICE方式获取。该类常用的方法如下表:
BluetoothDevice类
该类表示一个远程的蓝牙设备,该对象包含了对蓝牙硬件的基本信息以及对蓝牙设备的操作,对于基本信息而言,这部分是硬件固有的属性,如MAC地址,其提供了外部访问的接口,另外还封装了一些逻辑操作,如建立通信连接、获取绑定状态等,这些都是与使用过程相关的信息。其提供的常用方法如下表:
BluetoothSocket类
与TCP通信的Socket类似,该类表示了蓝牙通信的逻辑连接,通过该类实现数据的读取与写入,控制通信过程。其提供的方法如下表:
BluetoothServerSocket类
该类主要用于当设备作为服务端时的操作,服务端一般会被动的等待来自客户端的连接或服务请求,因此其功能与提供的方法也非常简单,如下表:
在进行蓝牙通信时其基本的也是关键的步骤主要有5步:
1、 开启蓝牙
2、 查找附近已配对或可用的设备
3、 创建通信连接
4、 获取输入输出流并读取或写入数据
5、 关闭连接、释放资源
4.1 实验步骤
1.在AndroidManifest.xml中申请蓝牙相关操作权限
- 请求用户开启蓝牙设备
如图:
在此之前同过BluetoothAdapter.getDefaultAdapter()方法获取蓝牙适配器对象
- 搜索附近可用否设备 bluetoothAdapter.startDiscovery()
如下图:
可以看到搜索到了四个蓝牙设备
4、连接设备,连接设备时需要确保搜索过程已经结束,否则会出现异常。 另外利用createRfcommSocketToServiceRecord(UUID)的方式可能会连接异常,可以使用Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); bluetoothSocket = (BluetoothSocket) m.invoke(device, Integer.valueOf(1)); 的方式获取bluetoothSocket对象。
5、发送信息,其数据的传递是通过字节流的方式进行的。
- 开发服务端应用: 与客户端一样也需要申请蓝牙相关的权限、开启蓝牙设备等。不同的是在服务端需要监听来自客户端的请求。主要代码如下:
由于bluetoothServerSocket的accept方法会阻塞主线程,因此需要另外开辟新的线程来处理来自客户端的连接请求,在accept方法成功返回后,会得到一个与客户端连接的bluetoothSocket对象,通过该对象可以获取客户端传递过来的数据,也可以通过该对象想客户端发送数据,这样就实现了双方的互相通信。主要代码如下:
上述代码实现了简单的字符串数据传递,对于大容量的二进制数据其处理方式大致与此类似。需要注意的是,由于蓝牙版本的不同,也可能导致在建立连接时出现各种异常,因此,为了应用的通用性需要做更多的适配工作。
至此,完成Android设备通过蓝牙通信。